#include "ScenePrecompiled.hxx"
#include "SceneChild.hxx"
#include "Scene.hxx"

#include "InternalSceneChildImpl.hxx"

Void Eifersucht::SceneChild::InternalRestart()
{
	//InternalRelease();

	if ( !m_pImpl )
	{
		m_pImpl = new _Internal_impl(this);
	}
}

Void Eifersucht::SceneChild::InternalRelease()
{
	Safe_Delete( m_pImpl );
}

Eifersucht::SceneChild::SceneChild( _In_opt_ Eifersucht::SceneChildPtr pChild ) : 
	m_pParentScene(nullptr),
	m_pParentChild(nullptr),
	m_pContext(nullptr),
	m_pImpl(nullptr)
{
	PrintToDebugWindowOnly8(
		"Eifersucht::SceneChild: Info: "
		"Creating scene child."
		);

	InternalRestart();
	SetParentChild( pChild );
}

Eifersucht::SceneChild::~SceneChild()
{
	PrintToDebugWindowOnly8( 
		"Eifersucht::SceneChild: Info: "
		"Destroying scene child." 
		);

	InternalRelease();
	for ( auto pChild : m_Children )
	{
		Safe_Delete(pChild);
	}

	m_Name.clear();
	m_Children.clear();
	Safe_Delete(m_pContext);
}

Void Eifersucht::SceneChild::ReleaseExternalResourcesRecursively()
{
	PrintToDebugWindowOnly8( "Eifersucht::SceneChild: Info: "
		"Releasing external resources." 
		);
	PrintToDebugWindowOnly16( 
		m_Name.data() 
		);

	if ( m_pContext ) m_pContext->ReleaseExternalResources();
	Safe_Delete( m_pImpl );

	for ( auto pChild : m_Children )
	{
		pChild->ReleaseExternalResourcesRecursively();
	}
}

Eifersucht::SceneChild::ContextType Eifersucht::SceneChild::GetChildContextType()
{
	if ( m_pContext )
	{
		return m_pContext->GetContextType();
	}
	else
	{
		return ContextType::Unknown;
	}
}

Bool Eifersucht::SceneChild::IsRootChild() const
{
	// return m_pParentChild == nullptr;
	return m_bIsRootChild;
}

Void Eifersucht::SceneChild::AsRootChild()
{
	// _ASSERT_EXPR(false, "Eifersucht::SceneChild::AsRootChild is not implemented yet.");
	return SetParentChild(nullptr);
}

#pragma region Parent scene and scene child 

// Parent child access

void Eifersucht::SceneChild::SetParentChild( _In_opt_ SceneChildPtr pChild )
{
	if ( pChild )
	{
		m_pParentChild = pChild;
		m_bIsRootChild = false;
	}
	else
	{
		m_pParentChild = nullptr;
		m_bIsRootChild = true;
	}
}

Eifersucht::SceneChildConstPtrConst Eifersucht::SceneChild::GetParentChild() const
{
	return m_pParentChild;
}

Eifersucht::SceneChildPtr Eifersucht::SceneChild::GetParentChild()
{
	return m_pParentChild;
}

// Parent scene access

void Eifersucht::SceneChild::SetParentScene( _In_opt_ ScenePtr pScene )
{
	m_pParentScene = pScene;
}

Eifersucht::SceneConstPtrConst Eifersucht::SceneChild::GetParentScene() const
{
	return m_pParentScene;
}

Eifersucht::ScenePtr Eifersucht::SceneChild::GetParentScene()
{
	return m_pParentScene;
}

#pragma endregion

void Eifersucht::SceneChild::SetName( Char16ConstPtr szName )
{
	m_Name = szName;
}

void Eifersucht::SceneChild::SetName( Char16Ptr szName )
{
	m_Name = szName;
}

Char16ConstPtrConst Eifersucht::SceneChild::GetName() const
{
	return m_Name.data();
}